package com.nlecloud.bc.util;

import com.nlecloud.bc.model.User;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.extern.slf4j.Slf4j;

import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.Date;

/**
 * @author warrior
 * @description jwt工具类
 */
@Slf4j
public class JwtUtil {

    /**
     * token有效期，单位毫秒，24小时
     */
    private static final long EXPIRE_TIME = 86400000;

    /**
     * 密钥
     */
    private static final String SECRET_KEY = Base64.getEncoder().encodeToString("copyright-api-secret".getBytes(StandardCharsets.UTF_8));

    /**
     * 生成token
     *
     * @param id
     * @param username
     * @return
     */
    public static String generateToken(String id, String username) {
        Date validity = new Date((new Date()).getTime() + EXPIRE_TIME);
        return Jwts.builder()
                //代表这个JWT的主体，即它的所有人
                .setSubject(id)
                //表这个JWT的签发主体
                .setIssuer("")
                //是一个时间戳，代表这个JWT的签发时间
                .setIssuedAt(new Date())
                .claim("id", id)
                .claim("username", username)
                .signWith(SignatureAlgorithm.HS512, SECRET_KEY)
                //token有效期
                .setExpiration(validity)
                .compact();
    }

    /**
     * 校验token
     * @param token
     * @return
     */
    public static User checkToken(String token){
        if(validateToken(token)){
            Claims claims = Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody();
            String id = claims.get("id", String.class);
            String username = claims.get("username",String.class);
            return new User(id,username);
        }
        log.error("***token无效***");
        return null;
    }

    private static boolean validateToken(String authToken) {
        try {
            Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(authToken);
            return true;
        } catch (Exception e) {
            log.error("无效的token：" + authToken);
        }
        return false;
    }

}
